package com.study_security.controller;

import com.study_security.domain.LoginUser;
import com.study_security.dto.ProjectAiDTO;
import com.study_security.dto.TaskDTO;
import com.study_security.entity.Project;
import com.study_security.service.ProjectService;
import com.study_security.service.TaskService;
import com.study_security.service.WenxinService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import com.study_security.dto.TaskAiDTO;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/wenxin")
public class WenxinController {

    @Autowired
    private WenxinService wenxinService;

    @Autowired
    private ProjectService projectService;


    @Autowired
    private TaskService taskService;

    private Long getUserId(Authentication authentication) {
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        return loginUser.getUser().getId();
    }

    private String answer;

    @PostMapping("/chat")
    public String analyzeProject(@RequestBody String userInput, Authentication authentication) {
        // 获取用户的所有项目列表
        Long userId = getUserId(authentication);
        List<Project> userProjects = projectService.getOngoingProjects(userId);

        // 提取所有项目名称到一个 List 中
        List<String> projectNames = new ArrayList<>();
        for (Project project : userProjects) {
            projectNames.add(project.getProjectName());
        }

        // 匹配用户输入中的项目名称
        Optional<String> matchedProjectName = projectNames.stream()
                .filter(userInput::contains)
                .findFirst();

        // 如果没有匹配到项目名称，返回提示信息
        if (!matchedProjectName.isPresent()) {

            answer = wenxinService.getResponse(userInput); // 将用户输入直接传递到提问接口
            return answer; // 返回提问结果

        }

        String projectName = matchedProjectName.get();

        // 调用 WenxinService 获取项目详情
        List<ProjectAiDTO> projects = wenxinService.getProjectByProjectName(projectName);

        // 如果没有找到对应项目，返回提示信息
        if (projects == null || projects.isEmpty()) {
            return "未找到名称为 " + projectName + " 的项目，请检查项目名称是否正确。";
        }


        // 假设只返回一个项目（或者取第一个项目）
        ProjectAiDTO project = projects.get(0);

        // 将项目数据动态嵌入到预设的消息模板中
        //String messageTemplate = "我有一个项目，项目名称为A,项目状态为B,项目开始时间为C,项目结束时间为D,项目初始成本为E,项目类型为F,项目预算为G,项目的合同额为H,项目目前进度为I,项目的重要程度为J,请你分析我这个项目目前的情况,情况包括现状、前景、以及需要的措施等，只需给出一段论述即可。";
        String messageTemplate1 = "我有一个项目，项目名称为A,项目状态为B,项目开始时间为C,项目结束时间为D,项目初始成本为E,项目类型为F,项目预算为G,项目的合同额为H,项目目前进度为I,项目的重要程度为J, ";
        // 格式化日期（如果日期为 null 则设置为 "未知"）
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String startDate = project.getStartDate() != null ? project.getStartDate().format(dateFormatter) : "未知";
        String endDate = project.getEndDate() != null ? project.getEndDate().format(dateFormatter) : "未知";

        // 动态替换模板中的占位符
        String message = messageTemplate1
                .replace("A", project.getProjectName())
                .replace("B", project.getProjectStatus())
                .replace("C", startDate)
                .replace("D", endDate)
                .replace("E", project.getCost() != null ? project.getCost().toString() : "未知")
                .replace("F", project.getProjectType())
                .replace("G", project.getBudget() != null ? project.getBudget().toString() : "未知")
                .replace("H", project.getContractAmount() != null ? project.getContractAmount().toString() : "未知")
                .replace("I", project.getTaskProgress() != null ? project.getTaskProgress() + "%" : "未知")
                .replace("J", project.getImportantLevel());

        message += userInput;
        // 调用 WenxinService 的 getResponse 方法

        answer = wenxinService.getResponse(message); // 将结果存储到 lastResponse
        System.out.println(answer);
        return answer;
    }













    @PostMapping("/chat/task")
    public String analyzeTask(@RequestBody String userInput, Authentication authentication) {
        // 获取用户ID
        Long userId = getUserId(authentication);

        // 获取用户的所有任务
        List<TaskDTO> userTasks = taskService.getTasksByMemberId(userId);

        // 提取所有任务名称到一个 List 中
        List<String> taskNames = new ArrayList<>();
        for (TaskDTO task : userTasks) {
            taskNames.add(task.getTaskName());
        }

        // 匹配用户输入中的任务名称
        Optional<String> matchedTaskName = taskNames.stream()
                .filter(userInput::contains)
                .findFirst();

        // 如果没有匹配到任务名称，直接将用户输入作为提问
        if (!matchedTaskName.isPresent()) {
            System.out.println(userInput);
            answer = wenxinService.getResponse(userInput);
            return answer;
        }

        String taskName = matchedTaskName.get();

        // 获取任务详细信息
        List<TaskAiDTO> taskDetails = taskService.getTaskDetailsByTaskName(taskName, userId);

        // 如果没有找到对应任务，返回提示信息
        if (taskDetails == null || taskDetails.isEmpty()) {
            return "未找到名称为 " + taskName + " 的任务，请检查任务名称是否正确。";
        }

        // 假设只返回一个任务（或者取第一个任务）
        TaskAiDTO task = taskDetails.get(0);

        // 通过任务的 projectId 获取项目名称
        // 假设 TaskAiDTO 包含 projectId，或者需要修改 TaskAiDTO 以包含 projectId
        // 这里假设 task.getProjectName() 已经包含了项目名称

        // 准备预设的消息模板
        String messageTemplate1 = "我有一个项目，我给你介绍一下项目情况，项目名称为A,项目状态为B,项目开始时间为C,项目结束时间为D,项目初始成本为E,项目类型为F,项目预算为G,项目的合同额为H,项目目前进度为I,项目的重要程度为J, ";

        // 格式化日期（如果日期为 null 则设置为 "未知"）
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String startDate = task.getStartDate() != null ? task.getStartDate().format(dateFormatter) : "未知";
        String endDate = task.getEndDate() != null ? task.getEndDate().format(dateFormatter) : "未知";

        // 获取项目详细信息
        // 假设可以通过项目名称获取项目ID
        String projectName = task.getProjectName();
        List<ProjectAiDTO> projects = wenxinService.getProjectByProjectName(projectName);

        if (projects == null || projects.isEmpty()) {
            return "未找到名称为 " + projectName + " 的项目，请检查项目名称是否正确。";
        }

        ProjectAiDTO project = projects.get(0);

        // 替换模板中的占位符
        String message1 = messageTemplate1
                .replace("A", project.getProjectName())
                .replace("B", project.getProjectStatus())
                .replace("C", project.getStartDate() != null ? project.getStartDate().format(dateFormatter) : "未知")
                .replace("D", project.getEndDate() != null ? project.getEndDate().format(dateFormatter) : "未知")
                .replace("E", project.getCost() != null ? project.getCost().toString() : "未知")
                .replace("F", project.getProjectType())
                .replace("G", project.getBudget() != null ? project.getBudget().toString() : "未知")
                .replace("H", project.getContractAmount() != null ? project.getContractAmount().toString() : "未知")
                .replace("I", project.getTaskProgress() != null ? project.getTaskProgress() + "%" : "未知")
                .replace("J", project.getImportantLevel());

        // 第二句话：任务详情
        String message2Template = "在这个项目中我的任务是A，工时是B,开始时间是C,结束时间是D，";
        String message2 = message2Template
                .replace("A", task.getTaskName())
                .replace("B", task.getWorkHours() != null ? task.getWorkHours().toString() : "未知")
                .replace("C", task.getStartDate() != null ? task.getStartDate().format(dateFormatter) : "未知")
                .replace("D", task.getEndDate() != null ? task.getEndDate().format(dateFormatter) : "未知");

        // 第三句话：用户的原始输入
        String message3 = userInput;

        // 第四句话：固定的括号内容
        String message4 = "（主要围绕这个任务来说）";

        // 组合所有消息
        String combinedMessage = message1 + message2 + message3 + " " + message4;
        System.out.println(combinedMessage);
        // 调用 WenxinService 的 getResponse 方法
        answer = wenxinService.getResponse(combinedMessage);
        System.out.println(answer);
        return answer;
    }


    @GetMapping("/answer")
    public String getLastResponse() {
        // 返回最新的反馈结果
        if (answer == null) {
            return "暂无反馈结果，请先调用聊天接口获取结果。";
        }
        return answer;
    }
}
